package cc.owoo.godpen.network.http;

import java.util.HashMap;
import java.util.Locale;

/**
 * 响应内容类型
 * Created by nimensei
 * 2022-02-25 下午 07:28
 **/
public class ContentType extends HeaderProperty<ContentType> {
    String type;// 文件类型
    String format;// 文件格式
    HashMap<String, String> property = new HashMap<>();// 文件参数

    public ContentType() {
        super("content-type");
    }

    /**
     * 拷贝对象
     *
     * @param contentType 拷贝源
     */
    public void copySet(ContentType contentType) {
        this.type = contentType.type;
        this.format = contentType.format;
        this.property.clear();
        this.property.putAll(contentType.property);
    }

    public boolean isEmpty() {
        return !(type != null && format != null);
    }

    @Override
    public String stringify() {
        StringBuilder string = new StringBuilder();
        if (!isEmpty())
            string.append(type).append('/').append(format);
        else
            return "";
        property.forEach((key, value) -> {
            string.append(';');
            string.append(key).append('=').append(value);
        });
        return string.toString();
    }

    @Override
    public ContentType parse(String values) {
        String[] array = values.split(";");
        type = array[0];
        int index = type.indexOf('/');
        if (index != -1) {
            format = type.substring(index + 1).trim();
            type = type.substring(0, index).trim();
        } else format = null;
        for (int i = 1; i < array.length; i++) {
            String s = array[i];
            index = s.indexOf('=');
            if (index == -1)
                continue;
            String key = s.substring(0, index).trim().toLowerCase(Locale.ROOT);
            if (key.length() == 0)
                continue;
            String value = s.substring(index + 1).trim().toLowerCase(Locale.ROOT);
            if (value.length() == 0)
                continue;
            property.put(key.toLowerCase(Locale.ROOT), value);
        }
        return this;
    }

    public void clear() {
        type = null;
        format = null;
        property.clear();
    }

    /**
     * 是否为文本类型
     *
     * @return 是否为文本类型
     */
    public boolean isText() {
        if (isEmpty())
            return false;
        return type.equals("text") || (type.equals("application") && (format.equals("json") || format.equals("javascript") || format.equals("x-javascript")));
    }

    /**
     * 是否为图片类型
     *
     * @return 是否为图片类型
     */
    public boolean isImage() {
        if (isEmpty())
            return false;
        return type.equals("image");
    }

    /**
     * 是否为音频类型
     *
     * @return 是否为音频类型
     */
    public boolean isAudio() {
        if (isEmpty())
            return false;
        return type.equals("audio");
    }

    /**
     * 是否为视频类型
     *
     * @return 是否为视频类型
     */
    public boolean isVideo() {
        if (isEmpty())
            return false;
        return type.equals("video");
    }

    /**
     * 是否为HTML类型
     *
     * @return 是否为HTML类型
     */
    public boolean isHTML() {
        if (isEmpty())
            return false;
        return type.equals("text") && format.equals("html");
    }

    /**
     * 是否为CSS类型
     *
     * @return 是否为CSS类型
     */
    public boolean isCSS() {
        if (isEmpty())
            return false;
        return type.equals("text") && format.equals("css");
    }

    /**
     * 是否为JavaScript类型
     *
     * @return 是否为JavaScript类型
     */
    public boolean isJavaScript() {
        if (isEmpty())
            return false;
        return type.equals("application") && format.equals("javascript");
    }

    /**
     * 获取文件类型，例如text、application，可能为空
     *
     * @return 文件类型
     */
    public String getType() {
        return type;
    }

    /**
     * 设置内容类型
     *
     * @param type 内容类型
     */
    public void setType(String type) {
        if (type != null && (type = type.trim()).length() == 0)
            type = null;
        this.type = type.toLowerCase(Locale.ROOT);
    }

    /**
     * 获取文件格式，例如html、json，可能为空
     *
     * @return 文件格式
     */
    public String getFormat() {
        return format;
    }


    /**
     * 设置内容格式
     *
     * @param format 内容格式
     */
    public void setFormat(String format) {
        if (format != null && (format = format.trim()).length() == 0)
            format = null;
        this.format = format.toLowerCase(Locale.ROOT);
    }

    /**
     * 获取文件属性，例如传入key：charset，返回utf-8，可能为空
     *
     * @param key 键
     * @return 值
     */
    public String getProperty(String key) {
        if (key == null)
            return null;
        return property.get(key.trim().toLowerCase(Locale.ROOT));
    }

    /**
     * 设置内容属性
     *
     * @param key   键
     * @param value 值
     * @return 是否设置成功
     */
    public boolean setProperty(String key, String value) {
        if (key == null || value == null)
            return false;
        if ((key = key.trim()).length() == 0 || (value = value.trim()).length() == 0)
            return false;
        property.put(key, value);
        return true;
    }


    @Override
    public String toString() {
        return stringify();
    }
}
